import axios from "axios";
import type { AxiosRequestConfig, AxiosResponse } from "axios";
import { UserAccountActiveResponseData, UserLoginResponseData, UserRegisterResponseData, UserTokenCheckResponseData } from "./types";

class Requests {
  private _baseURL: string;

  /**
   * 指定基本路由，获取一个封装的 请求对象实例
   * @param baseURL 基本路由：
   *   - 一般如果在开发模式下，会在各种脚手架的
   *     开发服务器种配置代理，将基本路由替换成
   *     某个字符串，如 'api'；
   *   - 如果用于 Web 服务器的部署，则会在如 Nginx
   *     这样的生产服务器种配置代理服务器；
   *   - 如果用于后端，如 NodeJS 种请求，因为后端
   *     请求不存在浏览器环境中的跨域问题，因此无
   *     需代理。
   */
  constructor(baseURL: string) {
    this._baseURL = baseURL;
  }

  /**
   * 发起 GET 请求
   * @param url 请求的接口路由地址
   * @param config 其它请求设置
   * @returns 
   */
  private _get<T>(
    url: string,
    config?: AxiosRequestConfig
  ): Promise<AxiosResponse<T>> {
    return axios.get<T>(this._baseURL + url, config);
  }

  /**
   * 发起 POST 请求
   * @param url 请求地址
   * @param data 数据对象
   * @param config 其它请求设置
   * @returns 
   */
  private _post<T>(
    url: string,
    data?: any,
    config?: AxiosRequestConfig
  ): Promise<AxiosResponse<T>> {
    return axios.post<T>(this._baseURL + url, data, config);
  }

  /**
   * 用户登陆
   * @param email 邮箱即账户
   * @param password 密码
   * @returns 
   */
  public loginUser(
    email: string,
    password: string
  ) {
    const url = "/Account/Login";
    const params = {
      email,
      password,
    };
    return this._get<UserLoginResponseData>(url, { params });
  }

  /**
   * 用户注册
   * @param email 邮箱
   * @param password 密码
   * @returns 
   */
  public registerUser(
    email: string,
    password: string
  ): Promise<AxiosResponse<UserRegisterResponseData>> {
    const url = "/Account/RegisterAccount";
    const data = {
      email,
      password,
    };
    return this._post(url, data);
  }

  /**激活用户*/
  public activeUserAccount(
    email: string,
    password: string,
    emailAuthCode: string
  ): Promise<AxiosResponse<UserAccountActiveResponseData>> {
    const url = "/Account/VerifyUser";
    const data = {
      email,
      password,
      emailAuthCode,
    };
    return this._post(url, data);
  }

  /**检测指定token是否有效*/
  public async checkUserToken(username: string, token: string): Promise<boolean> {
    const url = "/Account/CheckUserAuthToken";
    const data = {
      username: username,
      token: token
    };
    const resp: AxiosResponse<UserTokenCheckResponseData> = await this._post(url, data);
    return resp.data.checkState;
  }

  /**获取手机扫描登陆所需的二维码 */
  public async getQrcodeKey(): Promise<string> {
    const url = "/Account/QrcodeLoginKey";
    const params = {

    };
    const res = await this._get<{ key: string }>(url, { params });
    return res.data.key;
  }
}

const baseURL = "http://123.249.127.238:8080";
/**
 * # Axios单例
 * 
 * ## 用户登陆 API 调用示例
 * ```ts
 * requests
 *   .loginUser("291148484@163.com", "123456")
 *   .then((response) => {
 *     console.log(response.status);
 *     console.log(response.data);
 *   })
 *   .catch((error) => {
 *     console.error(error);
 *   });
 * ```
 * 
 * ## 用户注册 API 调用示例
 * ```ts
 * requests
 *   .registerUser("291148484@qq.com", "123456")
 *   .then((response) => {
 *     console.log(response.status);
 *     console.log(response.data);
 *   })
 *   .catch((error) => {
 *     console.error(error);
 *   });
 * ```
 * ## 激活用户 API 调用示例
 * ```ts
 * requests
 *   .verifyUser("xxx@xx.com", "123456", "cd3f9c9d-3735-4090-88d4-29f6a05a65ff")
 *   .then((response) => {
 *     console.log(response.status);
 *     console.log(response.data);
 *   })
 *   .catch((error) => {
 *     console.error(error);
 *   });
 * ```
 */
const requests = new Requests(baseURL);

export {
  requests,
}


